'''
作业：
实现学生管理系统：

学生信息包含：
    - 编号（sid), 姓名（name), 年龄（age), 性别（gender) 四个信息
    - 每个学生信息使用字典形式保存
    - 使用列表保存所有学生的信息

1. 实现菜单函数，输出下列信息，返回用户输入的编号，并进行输入校验。

    print("****************************************")
    print("*				学生管理系统			 *")
    print("*  	    1. 添加新学生信息              *")
    print("* 	    2. 通过学号修改学生信息		 *")
    print("*		3. 通过学号删除学生信息		 *")
    print("*		4. 通过姓名删除学生信息		 *")
    print("* 	    5. 通过学号查询学生信息          *")
    print("*		6. 通过姓名查询学生信息          *")
    print("*		7. 显示所有学生信息             *")
    print("*		8. 退出系统			  		 *")
    print("****************************************")
    select_op = input("输入编号选择操作：")

2. 实现控制函数，用来控制菜单的输出与功能的选择，直到用户选择8，结束程序运行。
3. 实现添加学生函数，函数参数为编号，姓名，年龄，性别四个参数，返回是否添加成功的结果，要求编号不可重复。
4. 实现修改函数，参数为学号，如果学生存在，则进行修改，不存在输出提示，并返回是否修改成功
5. 实现删除函数，参数为学号，如果学生存在，则进行删除，不存在输出提示，并返回是否删除成功
6. 实现删除函数，参数为姓名，如果学生存在，则进行删除（同名学生全部删除），不存在输出提示，并返回是否删除成功
7. 实现查询函数，参数为学号，如果学生存在，则输出学生信息，不存在输出提示，并返回是否查询成功
8. 实现查询函数，参数为姓名，如果学生存在，则输出学生信息（同名学生全部输出），不存在输出提示，并返回是否查询成功
9. 实现函数，输出所有学生信息
'''
import copy

'''可以一直添加，直到用户自己选择退出添加'''
def add(list_std):
    '编号（sid), 姓名（name), 年龄（age), 性别（gender)'
    flag = '1' #标记是否继续添加学生，0-不继续，1-继续
    while True:
        if flag.isdigit():
            flag = int(flag)
            if flag == 0:
                break
            elif flag == 1:
                sid = input("请输入学号：")
                #校验学号是否重复
                while sid_is_exist(list_std, sid)[0]:
                    sid = input("学号已存在，请重新输入学号：")
                name = input("请输入姓名：")
                age = input("请输入年龄：")
                gender = input("请输入性别：")
                student = {'sid': sid, 'name': name, 'age': age, 'gender': gender}
                '添加学生'
                list_std.append(student)
                flag = input("是否继续添加？0-否，1-是：")
            else:
                flag = input("您输入的内容不正确，请重新输入是否继续添加？0-否，1-是：")
'''只可改一次，用户可以选择退出修改'''
def modify(list_std):
    print("****************************************")
    print("*				bye：退出修改			 *")
    print("****************************************")

    sid = input("请输入待修改学生信息的学号：")
    # 校验学号是否存在
    while sid_is_exist(list_std, sid)[0]==False:
        if sid=='bye':
            break
        else:
            sid = input("学号不存在，请重新输入学号：")
    name = input("请输入新姓名：")
    age = input("请输入新年龄：")
    gender = input("请输入新性别：")
    student_new = {'sid': sid, 'name': name, 'age': age, 'gender': gender}
    list_del(list_std, sid)
    list_std.append(student_new)

'''只可删除一次，用户可以选择退出删除'''
def delete_by_sid(list_std):
    print("****************************************")
    print("*	     4.通过姓名删除学生信息       	 *")
    print("*		 bye：退出删除			 *")
    print("****************************************")

    sid = input("请输入待删除学生信息的学号：")
    # 校验学号是否存在
    while sid_is_exist(list_std, sid)[0] == False:
        if sid == 'bye':
            break
        else:
            sid = input("学号不存在，请重新输入学号：")
    list_del(list_std, sid)

'''只可删除一次，用户可以选择退出删除'''
def delete_by_name(list_std):
    print("****************************************")
    print("*	     4.通过姓名删除学生信息       	 *")
    print("*		 bye：退出删除		     	 *")
    print("****************************************")

    name = input("请输入待删除学生信息的姓名：")
    # 校验姓名是否存在
    while name_is_exist(list_std, name)[0] == False:
        if name == 'bye':
            break
        else:
            name = input("姓名不存在，请重新输入姓名：")
    list_del_by_name(list_std, name)

'''可以循环查询，直到用户自己选择退出查询'''
def search_by_sid(list_std):
    print("****************************************")
    print("*	     5. 通过学号查询学生信息        *")
    print("*		 bye：退出查询		     	 *")
    print("****************************************")

    while True:
        sid = input("请输入待查询学生信息的学号：")
        if sid == 'bye':
            break
        elif sid_is_exist(list_std, sid)[0] == False:
            print("查询失败，学号不存在。")
        else:
            print(sid_is_exist(list_std, sid)[1])

'''可以循环查询，直到用户自己选择退出查询'''
def search_by_name(list_std):
    print("****************************************")
    print("*	     6. 通过姓名查询学生信息        *")
    print("*		 bye：退出查询		     	 *")
    print("****************************************")

    while True:
        name = input("请输入待查询学生信息的姓名：")
        if name == 'bye':
            break
        elif name_is_exist(list_std, name)[0] == False:
            print("查询失败，姓名不存在。")
        else:
            print(name_is_exist(list_std, name)[1])


def print_all(list_std):
    if len(list_std) == 0:
        print(list_std)
    for i in list_std:
        print(i)

'''检查学号是否存在，并返回检查结果，以及学生信息'''
def sid_is_exist(list, sid):
    for i in list:
        if i.get('sid') == sid:
            return [True, i]
    return [False, None]

'''检查姓名是否存在，并返回检查结果，以及所有同名的学生信息'''
def name_is_exist(list, name):
    tmp = copy.deepcopy(list)
    stds = []
    for i in tmp:
        if i.get('name') == name:
            stds.append(i)
    if len(stds) > 0:
        return [True, stds]
    else:
        return [False, None]

'''根据学号删除学生'''
def list_del(list, sid):
    for i in list:
        if i.get('sid') == sid:
            list.remove(i)

'''根据姓名删除所有同名的学生'''
def list_del_by_name(list, name):
    tmp = copy.deepcopy(list)
    for i in tmp:
        if i.get('name') == name:
            list.remove(i)

def menu( list_std ):
    while True:
        print("****************************************")
        print("*				学生管理系统			 *")
        print("*  	    1. 添加新学生信息              *")
        print("* 	    2. 通过学号修改学生信息		 *")
        print("*		3. 通过学号删除学生信息		 *")
        print("*		4. 通过姓名删除学生信息		 *")
        print("* 	    5. 通过学号查询学生信息          *")
        print("*		6. 通过姓名查询学生信息          *")
        print("*		7. 显示所有学生信息             *")
        print("*		8. 退出系统			  		 *")
        print("****************************************")
        enter = input("请输入菜单数字：")
        if enter.isdigit():
            enter = int(enter)
            if enter == 1:
                add(list_std)
            elif enter == 2:
                modify(list_std)
            elif enter == 3:
                delete_by_sid(list_std)
            elif enter == 4:
                delete_by_name(list_std)
            elif enter == 5:
                search_by_sid(list_std)
            elif enter == 6:
                search_by_name(list_std)
            elif enter == 7:
                print_all(list_std)
            elif enter == 8:
                break
            else:
                print("请输入有效的菜单数字")
        else:
            print("请输有效的入菜单数字：")

if __name__ == '__main__':
    list_students = []
    menu(list_students)


